
package jeudelavie.vue;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Label;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.Border;
import javax.swing.border.LineBorder;
import jeudelavie.modele.Case;

/**
 *
 * @author epulapp
 */
public class Vue extends JFrame implements Observer {
    
    private Button btPlayStop;
    private Button btRestart;
    private Button btFeuilleBlanche;
    
    //Boutons et Labels couleurs
    private Button btCOrange;
    private Button btCBlanc;
    private Button btCBleu;
    private Button btCRouge;
    
    private Button btCOrangeB;
    private Button btCBlancB;
    private Button btCBleuB;
    private Button btCRougeB;
    
    private Label lblVie;
    private Label lblMort;
    
    //Couleurs actuelles
    private Color VieActuelle;
    private Color MortActuelle;
    
    private JPanel[][] tabPan;
    private Case[][] cases;
    
    public Vue(int hauteur, int largeur) {
        super();
        
        tabPan = new JPanel[hauteur][largeur]; // (0,0) est en haut a gauche
        VieActuelle = Color.red;
        MortActuelle = Color.white;
        build();
        
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent arg0) {
                super.windowClosing(arg0);
                System.exit(0);
    }
        });
    }
    
    private void build(){
        
        JPanel jpPrinc = new JPanel(new BorderLayout());
        this.setContentPane(jpPrinc);
        
        //Panel des boutons play/pause - regénérer - feuille blanche
        JPanel jpB = new JPanel(new FlowLayout());
        btPlayStop = new Button("Pause");
        jpB.add(btPlayStop);
        
        btRestart = new Button("Regénérer");
        jpB.add(btRestart);
        
        btFeuilleBlanche = new Button("feuille blanche");
        jpB.add(btFeuilleBlanche);
        
        
        //Panel des couleurs
        JPanel jpC = new JPanel(new FlowLayout());
        
        lblVie = new Label("Couleurs des cellules :");
        jpC.add(lblVie);
        
        btCOrange = new Button();
        btCOrange.setBackground(Color.orange);
        jpC.add(btCOrange);
        
        btCBlanc = new Button();
        btCBlanc.setBackground(Color.white);
        jpC.add(btCBlanc);
        
        btCBleu = new Button();
        btCBleu.setBackground(Color.blue);
        jpC.add(btCBleu);
        
        btCRouge = new Button();
        btCRouge.setBackground(Color.red);
        jpC.add(btCRouge);
        
        
        //Ajout des ActionListeners pour les couleurs
        //Cellules
        btCOrange.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.orange;
            }
        });
        
        btCBlanc.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.white;
            }
        });
        
        btCBleu.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.blue;
            }
        });
        
        btCRouge.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                VieActuelle = Color.red;
            }
        });
        
        
        jpPrinc.add(jpB,BorderLayout.NORTH);
        jpPrinc.add(jpC,BorderLayout.EAST);
        
        JPanel jpG = new JPanel(new GridLayout(tabPan.length,tabPan[0].length));
        jpG.setVisible(true);
        
        jpPrinc.add(jpG,BorderLayout.CENTER);
        
        for (int i = 0;i<tabPan[0].length;i++)
        {
            for (int j=0;j<tabPan.length;j++){
                tabPan[i][j] = new JPanel();
                tabPan[i][j].setBackground(MortActuelle);
                tabPan[i][j].setVisible(true);
                //tabPan[i][j].setBorder(new LineBorder(Color.gray)); //Cadrillage
                jpG.add(tabPan[i][j]);
            }
        }
        
        jpPrinc.setVisible(true);
        this.setSize(new Dimension(1000,600));
        this.setLocation(500, 300);
        this.setVisible(true);
        
        
    }

    @Override
    public void update(Observable o, Object arg) {
        
        cases = (Case[][])arg;
         for (int i = 0;i<tabPan[0].length;i++)
        {
            for (int j=0;j<tabPan.length;j++){
                
                if (cases[i][j].isEtat()){
                    tabPan[i][j].setBackground(cases[i][j].getCouleur());
                } else {
                    tabPan[i][j].setBackground(MortActuelle);
                }
            }
        }
    }
    
    public JPanel[][] getTabPan(){
        return tabPan;
    }
    
    
    //Boutons de fonctions
    public Button getBtPlayStop(){
        return btPlayStop;
    }
    
    public Button getBtFeuilleBlanche(){
        return btFeuilleBlanche;
    }
    
    public Button getBtRestart(){
        return btRestart;
    }
    
    //Couleurs cellules
    public Button getBtCOrange(){
        return btCOrange;
    }
    
    public Button getBtCBlanc(){
        return btCBlanc;
    }
    
    public Button getBtCBleu(){
        return btCBleu;
    }
    
    public Button getBtCRouge(){
        return btCRouge;
    }
    
    
    public void setVieActuelle(Color _c){
        VieActuelle = _c;
    }
    
    public void setMortActuelle(Color _c){
        MortActuelle = _c;
    }
    
    public Case[][] getCases(){
        return cases;
    }
}
